{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-23T09:27:17.167814500Z",
     "start_time": "2024-05-23T09:27:15.771045200Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.cluster import KMeans\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import silhouette_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-23T09:27:27.828905800Z",
     "start_time": "2024-05-23T09:27:20.064447200Z"
    }
   },
   "outputs": [],
   "source": [
    "# 读取四张表的数据\n",
    "# 读取了订单和产品id的关联，csv比较大\n",
    "prior = pd.read_csv(\"./data/instacart/order_products__prior.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T09:56:14.890179500Z",
     "start_time": "2024-05-13T09:56:14.818604100Z"
    }
   },
   "outputs": [],
   "source": [
    "# 产品id，与过道的对应\n",
    "products = pd.read_csv(\"./data/instacart/products.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T09:56:18.170890700Z",
     "start_time": "2024-05-13T09:56:16.547318900Z"
    }
   },
   "outputs": [],
   "source": [
    "# 订单id和用户id的对应，csv比较大\n",
    "orders = pd.read_csv(\"./data/instacart/orders.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T09:56:29.441477100Z",
     "start_time": "2024-05-13T09:56:29.414513600Z"
    }
   },
   "outputs": [],
   "source": [
    "# 超市的过道，过道放的产品的品类\n",
    "aisles = pd.read_csv(\"./data/instacart/aisles.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "   order_id  product_id  add_to_cart_order  reordered\n0         2       33120                  1          1\n1         2       28985                  2          1\n2         2        9327                  3          0\n3         2       45918                  4          1\n4         2       30035                  5          0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>order_id</th>\n      <th>product_id</th>\n      <th>add_to_cart_order</th>\n      <th>reordered</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2</td>\n      <td>33120</td>\n      <td>1</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>28985</td>\n      <td>2</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>9327</td>\n      <td>3</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>45918</td>\n      <td>4</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>30035</td>\n      <td>5</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prior.head()  #订单id，产品id"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T09:56:46.045649Z",
     "start_time": "2024-05-13T09:56:45.988183400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "   product_id                                       product_name  aisle_id  \\\n0           1                         Chocolate Sandwich Cookies        61   \n1           2                                   All-Seasons Salt       104   \n2           3               Robust Golden Unsweetened Oolong Tea        94   \n3           4  Smart Ones Classic Favorites Mini Rigatoni Wit...        38   \n4           5                          Green Chile Anytime Sauce         5   \n\n   department_id  \n0             19  \n1             13  \n2              7  \n3              1  \n4             13  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>product_id</th>\n      <th>product_name</th>\n      <th>aisle_id</th>\n      <th>department_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>Chocolate Sandwich Cookies</td>\n      <td>61</td>\n      <td>19</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>All-Seasons Salt</td>\n      <td>104</td>\n      <td>13</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>Robust Golden Unsweetened Oolong Tea</td>\n      <td>94</td>\n      <td>7</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4</td>\n      <td>Smart Ones Classic Favorites Mini Rigatoni Wit...</td>\n      <td>38</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>5</td>\n      <td>Green Chile Anytime Sauce</td>\n      <td>5</td>\n      <td>13</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "products.head() #产品id，产品名称，过道id"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T09:56:48.681752Z",
     "start_time": "2024-05-13T09:56:48.625339700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "   order_id  user_id eval_set  order_number  order_dow  order_hour_of_day  \\\n0   2539329        1    prior             1          2                  8   \n1   2398795        1    prior             2          3                  7   \n2    473747        1    prior             3          3                 12   \n3   2254736        1    prior             4          4                  7   \n4    431534        1    prior             5          4                 15   \n\n   days_since_prior_order  \n0                     NaN  \n1                    15.0  \n2                    21.0  \n3                    29.0  \n4                    28.0  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>order_id</th>\n      <th>user_id</th>\n      <th>eval_set</th>\n      <th>order_number</th>\n      <th>order_dow</th>\n      <th>order_hour_of_day</th>\n      <th>days_since_prior_order</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2539329</td>\n      <td>1</td>\n      <td>prior</td>\n      <td>1</td>\n      <td>2</td>\n      <td>8</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2398795</td>\n      <td>1</td>\n      <td>prior</td>\n      <td>2</td>\n      <td>3</td>\n      <td>7</td>\n      <td>15.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>473747</td>\n      <td>1</td>\n      <td>prior</td>\n      <td>3</td>\n      <td>3</td>\n      <td>12</td>\n      <td>21.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2254736</td>\n      <td>1</td>\n      <td>prior</td>\n      <td>4</td>\n      <td>4</td>\n      <td>7</td>\n      <td>29.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>431534</td>\n      <td>1</td>\n      <td>prior</td>\n      <td>5</td>\n      <td>4</td>\n      <td>15</td>\n      <td>28.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "orders.head() #订单id，用户id"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T09:57:09.498140400Z",
     "start_time": "2024-05-13T09:57:09.459787Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [
    {
     "data": {
      "text/plain": "     aisle_id                       aisle\n0           1       prepared soups salads\n1           2           specialty cheeses\n2           3         energy granola bars\n3           4               instant foods\n4           5  marinades meat preparation\n..        ...                         ...\n129       130    hot cereal pancake mixes\n130       131                   dry pasta\n131       132                      beauty\n132       133  muscles joints pain relief\n133       134  specialty wines champagnes\n\n[134 rows x 2 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>aisle_id</th>\n      <th>aisle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>prepared soups salads</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>specialty cheeses</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>energy granola bars</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4</td>\n      <td>instant foods</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>5</td>\n      <td>marinades meat preparation</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>129</th>\n      <td>130</td>\n      <td>hot cereal pancake mixes</td>\n    </tr>\n    <tr>\n      <th>130</th>\n      <td>131</td>\n      <td>dry pasta</td>\n    </tr>\n    <tr>\n      <th>131</th>\n      <td>132</td>\n      <td>beauty</td>\n    </tr>\n    <tr>\n      <th>132</th>\n      <td>133</td>\n      <td>muscles joints pain relief</td>\n    </tr>\n    <tr>\n      <th>133</th>\n      <td>134</td>\n      <td>specialty wines champagnes</td>\n    </tr>\n  </tbody>\n</table>\n<p>134 rows × 2 columns</p>\n</div>"
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aisles #过道id，对应过道里放了哪些产品类别"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T10:13:20.700203400Z",
     "start_time": "2024-05-13T10:13:20.624198500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:02:44.142116100Z",
     "start_time": "2024-05-13T10:00:59.655898100Z"
    }
   },
   "outputs": [],
   "source": [
    "# 合并四张表到一张表  （用户-物品类别）\n",
    "#订单表和产品表关联\n",
    "#用户买了哪些订单，订单里面有哪些产品，产品对应的过道，过道对应的产品类别\n",
    "_mg = pd.merge(prior, products, on=['product_id', 'product_id'])\n",
    "_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])\n",
    "mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:03:23.951954500Z",
     "start_time": "2024-05-13T10:03:23.839360500Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "   order_id  product_id  add_to_cart_order  reordered        product_name  \\\n0         2       33120                  1          1  Organic Egg Whites   \n1        26       33120                  5          0  Organic Egg Whites   \n2       120       33120                 13          0  Organic Egg Whites   \n3       327       33120                  5          1  Organic Egg Whites   \n4       390       33120                 28          1  Organic Egg Whites   \n5       537       33120                  2          1  Organic Egg Whites   \n6       582       33120                  7          1  Organic Egg Whites   \n7       608       33120                  5          1  Organic Egg Whites   \n8       623       33120                  1          1  Organic Egg Whites   \n9       689       33120                  4          1  Organic Egg Whites   \n\n   aisle_id  department_id  user_id eval_set  order_number  order_dow  \\\n0        86             16   202279    prior             3          5   \n1        86             16   153404    prior             2          0   \n2        86             16    23750    prior            11          6   \n3        86             16    58707    prior            21          6   \n4        86             16   166654    prior            48          0   \n5        86             16   180135    prior            15          2   \n6        86             16   193223    prior             6          2   \n7        86             16    91030    prior            11          3   \n8        86             16    37804    prior            63          3   \n9        86             16   108932    prior            16          1   \n\n   order_hour_of_day  days_since_prior_order aisle  \n0                  9                     8.0  eggs  \n1                 16                     7.0  eggs  \n2                  8                    10.0  eggs  \n3                  9                     8.0  eggs  \n4                 12                     9.0  eggs  \n5                  8                     3.0  eggs  \n6                 19                    10.0  eggs  \n7                 21                    12.0  eggs  \n8                 12                     3.0  eggs  \n9                 13                     3.0  eggs  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>order_id</th>\n      <th>product_id</th>\n      <th>add_to_cart_order</th>\n      <th>reordered</th>\n      <th>product_name</th>\n      <th>aisle_id</th>\n      <th>department_id</th>\n      <th>user_id</th>\n      <th>eval_set</th>\n      <th>order_number</th>\n      <th>order_dow</th>\n      <th>order_hour_of_day</th>\n      <th>days_since_prior_order</th>\n      <th>aisle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2</td>\n      <td>33120</td>\n      <td>1</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>202279</td>\n      <td>prior</td>\n      <td>3</td>\n      <td>5</td>\n      <td>9</td>\n      <td>8.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>26</td>\n      <td>33120</td>\n      <td>5</td>\n      <td>0</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>153404</td>\n      <td>prior</td>\n      <td>2</td>\n      <td>0</td>\n      <td>16</td>\n      <td>7.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>120</td>\n      <td>33120</td>\n      <td>13</td>\n      <td>0</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>23750</td>\n      <td>prior</td>\n      <td>11</td>\n      <td>6</td>\n      <td>8</td>\n      <td>10.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>327</td>\n      <td>33120</td>\n      <td>5</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>58707</td>\n      <td>prior</td>\n      <td>21</td>\n      <td>6</td>\n      <td>9</td>\n      <td>8.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>390</td>\n      <td>33120</td>\n      <td>28</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>166654</td>\n      <td>prior</td>\n      <td>48</td>\n      <td>0</td>\n      <td>12</td>\n      <td>9.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>537</td>\n      <td>33120</td>\n      <td>2</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>180135</td>\n      <td>prior</td>\n      <td>15</td>\n      <td>2</td>\n      <td>8</td>\n      <td>3.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>582</td>\n      <td>33120</td>\n      <td>7</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>193223</td>\n      <td>prior</td>\n      <td>6</td>\n      <td>2</td>\n      <td>19</td>\n      <td>10.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>608</td>\n      <td>33120</td>\n      <td>5</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>91030</td>\n      <td>prior</td>\n      <td>11</td>\n      <td>3</td>\n      <td>21</td>\n      <td>12.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>623</td>\n      <td>33120</td>\n      <td>1</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>37804</td>\n      <td>prior</td>\n      <td>63</td>\n      <td>3</td>\n      <td>12</td>\n      <td>3.0</td>\n      <td>eggs</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>689</td>\n      <td>33120</td>\n      <td>4</td>\n      <td>1</td>\n      <td>Organic Egg Whites</td>\n      <td>86</td>\n      <td>16</td>\n      <td>108932</td>\n      <td>prior</td>\n      <td>16</td>\n      <td>1</td>\n      <td>13</td>\n      <td>3.0</td>\n      <td>eggs</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mt.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:03:32.396775Z",
     "start_time": "2024-05-13T10:03:32.359058200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(32434489, 14)"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mt.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "data": {
      "text/plain": "order_id                  0.00000\nproduct_id                0.00000\nadd_to_cart_order         0.00000\nreordered                 0.00000\nproduct_name              0.00000\naisle_id                  0.00000\ndepartment_id             0.00000\nuser_id                   0.00000\neval_set                  0.00000\norder_number              0.00000\norder_dow                 0.00000\norder_hour_of_day         0.00000\ndays_since_prior_order    0.06407\naisle                     0.00000\ndtype: float64"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mt.isnull().sum()/len(mt)  #数据缺失率，没有缺失值"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-05-13T10:03:38.164987100Z",
     "start_time": "2024-05-13T10:03:34.374763600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:07:27.467436900Z",
     "start_time": "2024-05-13T10:05:38.443697600Z"
    }
   },
   "outputs": [],
   "source": [
    "# 交叉表（特殊的分组工具），如果在这一步内存不够了，重启一下jupyter，还是不行，筛选一部分用户的数据，进行聚类\n",
    "# 每个用户去过哪几个过道\n",
    "cross = pd.crosstab(mt['user_id'], mt['aisle'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:07:38.997695800Z",
     "start_time": "2024-05-13T10:07:38.941062700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "aisle    air fresheners candles  asian foods  baby accessories  \\\nuser_id                                                          \n1                             0            0                 0   \n2                             0            3                 0   \n3                             0            0                 0   \n4                             0            0                 0   \n5                             0            2                 0   \n6                             0            0                 0   \n7                             0            0                 0   \n8                             0            1                 0   \n9                             0            0                 0   \n10                            0            1                 0   \n\naisle    baby bath body care  baby food formula  bakery desserts  \\\nuser_id                                                            \n1                          0                  0                0   \n2                          0                  0                0   \n3                          0                  0                0   \n4                          0                  0                0   \n5                          0                  0                0   \n6                          0                  0                0   \n7                          0                  0                0   \n8                          0                  0                0   \n9                          0                  6                0   \n10                         0                  0                0   \n\naisle    baking ingredients  baking supplies decor  beauty  beers coolers  \\\nuser_id                                                                     \n1                         0                      0       0              0   \n2                         2                      0       0              0   \n3                         0                      0       0              0   \n4                         0                      0       0              0   \n5                         0                      0       0              0   \n6                         0                      0       0              0   \n7                         2                      0       0              0   \n8                         1                      0       0              0   \n9                         2                      0       0              0   \n10                        0                      0       0              0   \n\naisle    ...  spreads  tea  tofu meat alternatives  tortillas flat bread  \\\nuser_id  ...                                                               \n1        ...        1    0                       0                     0   \n2        ...        3    1                       1                     0   \n3        ...        4    1                       0                     0   \n4        ...        0    0                       0                     1   \n5        ...        0    0                       0                     0   \n6        ...        0    0                       0                     0   \n7        ...        0    0                       0                     0   \n8        ...        0    0                       0                     0   \n9        ...        0    0                       0                     0   \n10       ...        0    0                       0                     0   \n\naisle    trail mix snack mix  trash bags liners  vitamins supplements  \\\nuser_id                                                                 \n1                          0                  0                     0   \n2                          0                  0                     0   \n3                          0                  0                     0   \n4                          0                  0                     0   \n5                          0                  0                     0   \n6                          0                  0                     0   \n7                          0                  0                     0   \n8                          0                  0                     0   \n9                          0                  0                     0   \n10                         0                  0                     0   \n\naisle    water seltzer sparkling water  white wines  yogurt  \nuser_id                                                      \n1                                    0            0       1  \n2                                    2            0      42  \n3                                    2            0       0  \n4                                    1            0       0  \n5                                    0            0       3  \n6                                    0            0       0  \n7                                    0            0       5  \n8                                    0            0       0  \n9                                    2            0      19  \n10                                   0            0       2  \n\n[10 rows x 134 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th>aisle</th>\n      <th>air fresheners candles</th>\n      <th>asian foods</th>\n      <th>baby accessories</th>\n      <th>baby bath body care</th>\n      <th>baby food formula</th>\n      <th>bakery desserts</th>\n      <th>baking ingredients</th>\n      <th>baking supplies decor</th>\n      <th>beauty</th>\n      <th>beers coolers</th>\n      <th>...</th>\n      <th>spreads</th>\n      <th>tea</th>\n      <th>tofu meat alternatives</th>\n      <th>tortillas flat bread</th>\n      <th>trail mix snack mix</th>\n      <th>trash bags liners</th>\n      <th>vitamins supplements</th>\n      <th>water seltzer sparkling water</th>\n      <th>white wines</th>\n      <th>yogurt</th>\n    </tr>\n    <tr>\n      <th>user_id</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>1</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0</td>\n      <td>3</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>3</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>42</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>4</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>5</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>6</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n      <td>0</td>\n      <td>19</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>...</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>2</td>\n    </tr>\n  </tbody>\n</table>\n<p>10 rows × 134 columns</p>\n</div>"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "134\n",
      "134\n"
     ]
    }
   ],
   "source": [
    "print(mt['aisle_id'].nunique()) # 134个过道，每个过道都放自己的产品类别\n",
    "print(mt['aisle'].nunique())"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-05-13T10:10:41.446186900Z",
     "start_time": "2024-05-13T10:10:39.062981900Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:14:06.770226100Z",
     "start_time": "2024-05-13T10:14:06.752745200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(206209, 134)"
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#针对20万用户，有134个特征\n",
    "cross.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:14:42.678353400Z",
     "start_time": "2024-05-13T10:14:42.668357200Z"
    }
   },
   "outputs": [],
   "source": [
    "# 进行主成分分析，保留90%的成分，实际特征数目减少了134--》27\n",
    "pca = PCA(n_components=0.9)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:15:22.893245Z",
     "start_time": "2024-05-13T10:15:17.179517600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(206209, 27)"
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pca.fit_transform(cross)\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [
    {
     "data": {
      "text/plain": "numpy.ndarray"
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T10:15:53.911285900Z",
     "start_time": "2024-05-13T10:15:53.872033400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:20:23.245020900Z",
     "start_time": "2024-05-13T10:20:23.214387400Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(500, 27)"
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 挑选前500个用户的数据进行聚类\n",
    "x = data[:500]\n",
    "x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:20:34.758160500Z",
     "start_time": "2024-05-13T10:20:34.706393900Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-24.21565874   2.4294272   -2.46636975 ...   0.68680034   1.69439402\n",
      "   -2.34323022]\n",
      " [  6.46320806  36.75111647   8.38255336 ...   4.12121252   2.4468974\n",
      "   -4.28348478]\n",
      " [ -7.99030162   2.40438257 -11.03006405 ...   1.77534453  -0.44419403\n",
      "    0.78666557]\n",
      " ...\n",
      " [-11.92661183  -6.28156437   6.49043833 ...  -0.93499096  -0.1409791\n",
      "    0.04370174]\n",
      " [-18.05675245  -0.42589035  -3.92660866 ...  -1.02048351  -0.95283767\n",
      "    0.90135767]\n",
      " [-24.62244434  -0.5635177   -0.90551124 ...   0.86904501  -2.15569229\n",
      "   -0.40915483]]\n"
     ]
    }
   ],
   "source": [
    "print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:21:13.814357200Z",
     "start_time": "2024-05-13T10:21:13.791921700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "407.18563418250557"
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:21:15.548727400Z",
     "start_time": "2024-05-13T10:21:15.522733800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "-242.3484794930586"
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:01.173706700Z",
     "start_time": "2024-05-13T10:35:01.111539900Z"
    }
   },
   "outputs": [],
   "source": [
    "# 假设用户一共分为四个类别\n",
    "#n_clusters是分为几个类别，是主要的超参\n",
    "km = KMeans(n_clusters=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:02.711001300Z",
     "start_time": "2024-05-13T10:35:02.596733100Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\3.8\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n",
      "  super()._check_params_vs_input(X, default_n_init=10)\n"
     ]
    },
    {
     "data": {
      "text/plain": "KMeans(n_clusters=4)",
      "text/html": "<style>#sk-container-id-3 {color: black;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-3 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-3 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-3 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=4)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KMeans</label><div class=\"sk-toggleable__content\"><pre>KMeans(n_clusters=4)</pre></div></div></div></div></div>"
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "km.fit(x)  #开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:05.262100800Z",
     "start_time": "2024-05-13T10:35:05.227644500Z"
    }
   },
   "outputs": [],
   "source": [
    "#开始预测\n",
    "predict = km.predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n",
      "(500,)\n"
     ]
    }
   ],
   "source": [
    "print(type(predict))\n",
    "print(predict.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-05-13T10:26:44.192211300Z",
     "start_time": "2024-05-13T10:26:44.144841400Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 以之前的跨国礼品销售RFM划分用户等级为例，我们采用聚类算法，然后手动挑选出这4类用户进行分析"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:07.561998600Z",
     "start_time": "2024-05-13T10:35:07.536409Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 2\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0\n",
      " 2 0 0 0 0 0 0 0 0 0 0 2 0 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 2 0 0 0 2 0 0\n",
      " 0 0 0 3 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 2 0 0 0 0 3 1 0 0 0 2 0 0 0 0 0 0 0 0\n",
      " 3 0 0 0 2 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 2 0 3 0 0 0 2 0 0 0 0 0 0\n",
      " 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0\n",
      " 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1\n",
      " 0 0 0 2 0 0 0 2 0 2 0 0 0 0 0 0 0 3 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2\n",
      " 0 0 0 0 2 2 0 0 0 0 0 0 0 0 2 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "print(predict)  #预测得到的是每一个样本的类别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:28:48.877176700Z",
     "start_time": "2024-05-13T10:28:48.830726600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([0, 1, 2, 3])"
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.unique(predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:13.178989500Z",
     "start_time": "2024-05-13T10:35:12.929448100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<matplotlib.collections.PathCollection at 0x2e21dd597f0>"
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 1000x800 with 1 Axes>",
      "image/png": "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AXD66bDTTrmuTpJaJkOQJEk5FotFXQ9Hj851JZKUH5wOJ0mSJCmvNFoImj59Oqeffjqbb745bdq0YdCgQfz6179m9erVVc776KOP2HPPPWndujV9+/bl+uuvb6ySJEmSJKnxpsN9+umnpFIpbr/9drbYYgsmTZrEmWeeyfLly/njH/8IQGlpKQceeCCjR4/mtttuY+LEiZx22ml07NiRs846q7FKkySp+fn6PfjsJljwBgRx6HUIbHkeFA/JdWWS1OwEYZjJNm0N4w9/+AO33norX3zxBQC33norv/jFL5g3bx6FlTvBXXbZZTz++ON8+umn1V6jrKyMsrKytd+XlpbSt29fSkpKKCoqavw3IUlStn36F/jgxxAkIKyIngsqf465+3+g3/E5K02SmpLS0lKKi4trzQZZXRNUUlJC586d134/duxY9tprr7UBCOCggw5iypQpLF68uNprXHPNNRQXF6999O3bt9HrliQpZxa+FQUgWBeA1nwdJuGtk2DZ9FxUJknNVtZC0NSpU7nppps4++yz1z43b948evToUeW8Nd/Pmzev2utcfvnllJSUrH3MmjWr8YqWJCnXpty4btRnIyGQgqm3ZbMiSWr26hyCLrvsMoIgSPvYcCrbnDlzOPjggznhhBM488wzN6ngVq1aUVRUVOUhSVKLNf+VqiNAGwqT0TmSpIzVuTHCxRdfzKmnnpr2nIEDB679eu7cuey7777stttu/O1vf6tyXs+ePZk/f36V59Z837Nnz7qWJklSCxQ00DmSpDXqHIK6detGt27dMjp3zpw57Lvvvuy0007cfffdxGJVB55GjRrFL37xC8rLyykoKADghRdeYKuttqJTp051LU2SpJan52iY+WDNo0FBHHoekN2aJKmZa7Q1QXPmzGGfffahX79+/PGPf2ThwoXMmzevylqfk046icLCQk4//XQmT57MAw88wF/+8hcuuuiixipLkqTmZasLoylv1Qqi9UKDz67huCSpOo22T9ALL7zA1KlTmTp1Kn369KlybE1X7uLiYp5//nnOO+88dtppJ7p27coVV1zhHkGSJK3RdRfY5TZ474fRqM/aFtnx6LHnw9C2T/prSJKqyOo+QY0h017gkiQ1a0smwee3wPxXIZaAzQ6BwedA+wG5rkySmoxMs0GjjQRJkqQG1HE72PmWXFchSS1CVjdLlSRJkqRcMwRJkiRJyiuGIEmSJEl5xRAkSZIkKa/YGKEFWb5gOeP/Np7JD05m9dLV9BjWgxHnjmDQgYMIAncTlyRJksAQ1GLM/2g+9+x7D2VLyghTUdfzklklTHlyCjuesSOH/+1wg5AkSZKE0+FahGR5kn8f+m/KStYFIIAwGX39wd8/YPzt43NVniRJktSkGIJagClPTGHpnKVrQ89GAhj7p7E0831xJUmSpAZhCGoBpr82nVhBmj/KEBZNXcSKhSuyV5QkSZLURBmCWoAgCMBBHkmSJCkjhqAWoP9e/UlVpGo+IYDOgzvTtlvb7BUlSZIkNVGGoBZgq6O2oqhPEUG8hu5vIYy6eJTd4SRJkiQMQS1CvCDOSc+cROvi1gSxdUFnTSja6ayd2OmsnXJVniRJktSkuE9QC9FjaA/O+/Q8Pvj7B9FmqaXrNksdOHqgo0CSJElSpSBs5n2TS0tLKS4upqSkhKKiolyXI0mSJClHMs0GToeTJEmSlFcMQZIkSZLyiiFIkiRJUl4xBEmSJEnKK4YgSZIkSXnFECRJkiQprxiCJEmSJOUVQ5AkSZKkvGIIkiRJkpRXDEGSJEmS8oohSJIkSVJeMQRJkiRJyiuGIEmSJEl5xRAkSZIkKa8YgiRJkiTlFUOQJEmSpLxiCJIkSZKUVwxBkiRJkvKKIUiSJElSXjEESZIkScorhiBJkiRJecUQJEmSJCmvGIIkSZIk5RVDkCRJkqS8YgiSJEmSlFcMQZIkSZLyiiFIkiRJUl4xBEmSJEnKK4YgSZIkSXnFECRJkiQpryRyXYAkSZKk5idMhUx/bToLP15IYbtCBh82mHbd2uW6rIwYgiRJkiTVyayxs3js5MdYPG0xBEAIsUSMEeeM4MA/HUi8IJ7rEtMyBEn6//buPSjqev/j+ItVlovKioBcFFR0RPPSxZRZSsyRJI9zPHYbTzWaZZql3WRMzelYzDFNu073ZgrmTHbKbuqUp0IKmhS7eCCzkElDUbn4sxQsS26f3x/k1h5WApX9rn6fj5kd9vv5fvbLCz7zYffN9wYAANBuNV/X6F8T/qWm400tDablS3Njsz5/+nPV/1Svv738N+sCtgPnBAEAAABot8LsQjXVN8k0m9YrjVSSU6JDOw/5P1gHUAQBAAAAaJf6n+u1852dMk0+CqDfBHUN0vY12/2YquMoggAAAAC0y/Ha420WQJIUFBSkY/93zE+JTg1FEAAAAIB2CesVpq6hbV9WwDQbuZJcfkp0aiiCAAAAALRL19CuGnHDCDm6tlFGGOn8Gef7L9QpoAgCAAAA0G7jlo1TWK8wBXUJ8rk+/f50RfSN8HOqjqEIAgAAANBurkSXZm2dpYGZA1vuEfSbbrHdNOnpSRq3bJx14dqJ+wQBAAAA6JDIAZG64b0bVFtRq0Nlh+Ts7lSf0X3aPkwugFAEAQDQBmOkwkJp40apvl66+GLpmmuk0FCrkwGA9VxJroC/CIIvFEEAAJxEZaX0179K//2v1LWrFBQkNTRId90lvfmmNH681QkBAKfi7NhfBQCAnzU0SBkZ0vbf7vfX2NjSJklHjkh/+YtUWmpZPADAaaAIAgDAh3XrWoqcxsbW65qbW9offdTvsQAAZwBFEAAAPrz5ptSly8nXNzZKa9f6Lw8A4MyhCAIAwIejR6Wmprb7HDvmnywAgDOLIggAAB/OO6/lYggnExQkDR7svzwAgDOHIggAAB9mz/Z9PtAf3X67f7IAAM4siiAAAHxISZH++c+W547/ebd0OKTLLpPmzPF7LADAGUARBADASSxdKv3739KwYb+3RUdL998v/ec/ktNpXTYAwKnjZqkAALTh73+Xpk2Tamqk+nopIaHtc4UAAIGPP+MAAPyJoCApLs7qFACAM4XD4QAAAADYCkUQAAAAAFuhCAIAAABgKxRBAAAAAGyFIggAAACArVAEAQAAALAViiAAAAAAtkIRBAAAAMBWOrUImjJlipKSkhQaGqr4+HhNnz5dlZWVXn22b9+usWPHKjQ0VImJiVq1alVnRgIAAABgc51aBI0fP15r165VWVmZ3nrrLe3evVvXXHONZ31dXZ0mTpyofv36adu2bVq9erUeeOABvfjii50ZCwAAAICNBRljjL++2YYNGzR16lQdP35cwcHBeu6557R06VJVV1fL6XRKkhYvXqx169Zp586d7dpmXV2dXC6XamtrFRER0ZnxAQAAAASw9tYGfjsn6Mcff9SaNWuUlpam4OBgSVJRUZHS09M9BZAkZWZmqqysTIcPH/a5nePHj6uurs7rAQAAAADt1elF0KJFi9StWzdFRUWpoqJC69ev96yrrq5WbGysV/8Ty9XV1T63t2LFCrlcLs8jMTGx88IDAAAAOOd0uAhavHixgoKC2nz88VC2hQsXqri4WB9++KG6dOmiGTNm6HSOwFuyZIlqa2s9j3379p3ytgAAAADYT9eOviArK0szZ85ss09ycrLneXR0tKKjozV48GANHTpUiYmJ2rp1q9xut+Li4lRTU+P12hPLcXFxPrcdEhKikJCQjsYGAAAAAEmnUATFxMQoJibmlL5Zc3OzpJbzeiTJ7XZr6dKlamho8JwnlJeXp5SUFEVGRp7S9wAAAACAtnTaOUGfffaZnn76aZWUlGjv3r366KOPdN1112ngwIFyu92SpOuvv15Op1OzZs3SN998o9dff11PPvmkFixY0FmxAAAAANhcpxVB4eHhevvttzVhwgSlpKRo1qxZGjlypAoLCz2Hs7lcLn344YcqLy/XqFGjlJWVpX/84x+aM2dOZ8UCAAAAYHN+vU9QZ+A+QQAAAACkALxPEAAAAAAEgg5fGCHQnNiRxU1TAQAAAHs7URP82cFuZ30RdPToUUnipqkAAAAAJLXUCC6X66Trz/pzgpqbm1VZWakePXooKCjI6jhntbq6OiUmJmrfvn2cXxWAGJ/AxxgFPsYo8DFGgY8xCmx2Hx9jjI4ePaqEhAQ5HCc/8+es3xPkcDjUt29fq2OcUyIiImw5ac4WjE/gY4wCH2MU+BijwMcYBTY7j09be4BO4MIIAAAAAGyFIggAAACArVAEwSMkJETLli3z3MwWgYXxCXyMUeBjjAIfYxT4GKPAxvi0z1l/YQQAAAAA6Aj2BAEAAACwFYogAAAAALZCEQQAAADAViiCAAAAANgKRRAAAAAAW6EIsqHly5crLS1N4eHh6tmzp88+FRUVmjx5ssLDw9W7d28tXLhQjY2NXn0KCgp00UUXKSQkRIMGDVJubm7nh7ehgoICBQUF+Xx88cUXkqQ9e/b4XL9161aL09tH//79W/3+V65c6dVn+/btGjt2rEJDQ5WYmKhVq1ZZlNZ+9uzZo1mzZmnAgAEKCwvTwIEDtWzZMtXX13v1YR5Z65lnnlH//v0VGhqq1NRUff7551ZHsq0VK1Zo9OjR6tGjh3r37q2pU6eqrKzMq89ll13War7MnTvXosT288ADD7T6/Q8ZMsSz/tdff9W8efMUFRWl7t276+qrr1ZNTY2FiQNLV6sDwP/q6+t17bXXyu1266WXXmq1vqmpSZMnT1ZcXJy2bNmiqqoqzZgxQ8HBwXrooYckSeXl5Zo8ebLmzp2rNWvWKD8/X7fccovi4+OVmZnp7x/pnJaWlqaqqiqvtvvvv1/5+fm6+OKLvdo3bdqkYcOGeZajoqL8khEtsrOzNXv2bM9yjx49PM/r6uo0ceJEZWRk6Pnnn9fXX3+tm2++WT179tScOXOsiGsrO3fuVHNzs1544QUNGjRIO3bs0OzZs/Xzzz/rkUce8erLPLLG66+/rgULFuj5559XamqqnnjiCWVmZqqsrEy9e/e2Op7tFBYWat68eRo9erQaGxt13333aeLEifr222/VrVs3T7/Zs2crOzvbsxweHm5FXNsaNmyYNm3a5Fnu2vX3j/b33HOP3nvvPb3xxhtyuVyaP3++rrrqKm3evNmKqIHHwLZycnKMy+Vq1b5x40bjcDhMdXW1p+25554zERER5vjx48YYY+69914zbNgwr9dNmzbNZGZmdmpmGFNfX29iYmJMdna2p628vNxIMsXFxdYFs7l+/fqZxx9//KTrn332WRMZGemZQ8YYs2jRIpOSkuKHdPBl1apVZsCAAZ5l5pG1xowZY+bNm+dZbmpqMgkJCWbFihUWpsIJBw8eNJJMYWGhp23cuHHmrrvusi6UzS1btsycf/75PtcdOXLEBAcHmzfeeMPTVlpaaiSZoqIiPyUMbBwOh1aKioo0YsQIxcbGetoyMzNVV1enb775xtMnIyPD63WZmZkqKirya1Y72rBhg3744QfddNNNrdZNmTJFvXv31qWXXqoNGzZYkM7eVq5cqaioKF144YVavXq11yGkRUVFSk9Pl9Pp9LSd+C/34cOHrYhre7W1terVq1erduaR/9XX12vbtm1e7ysOh0MZGRm8rwSI2tpaSWo1Z9asWaPo6GgNHz5cS5Ys0bFjx6yIZ1vfffedEhISlJycrBtuuEEVFRWSpG3btqmhocFrTg0ZMkRJSUnMqd9wOBxaqa6u9iqAJHmWq6ur2+xTV1enX375RWFhYf4Ja0MvvfSSMjMz1bdvX09b9+7d9eijj+qSSy6Rw+HQW2+9palTp2rdunWaMmWKhWnt484779RFF12kXr16acuWLVqyZImqqqr02GOPSWqZMwMGDPB6zR/nVWRkpN8z29muXbv01FNPeR0KxzyyzqFDh9TU1OTzfWXnzp0WpcIJzc3Nuvvuu3XJJZdo+PDhnvbrr79e/fr1U0JCgrZv365FixaprKxMb7/9toVp7SM1NVW5ublKSUlRVVWVHnzwQY0dO1Y7duxQdXW1nE5nq3O/Y2NjPZ/l7I4i6ByxePFiPfzww232KS0t9TphDtY6lTHbv3+/PvjgA61du9arX3R0tBYsWOBZHj16tCorK7V69Wo+vJ2GjozRH3//I0eOlNPp1K233qoVK1YoJCSks6Pa1qnMowMHDuiKK67Qtdde63UOF/MI8G3evHnasWOHPv30U6/2P57POGLECMXHx2vChAnavXu3Bg4c6O+YtjNp0iTP85EjRyo1NVX9+vXT2rVr+Wd0O1AEnSOysrI0c+bMNvskJye3a1txcXGtrshz4moicXFxnq//e4WRmpoaRUREMPHa6VTGLCcnR1FRUe36QJaamqq8vLzTiWh7pzOvUlNT1djYqD179iglJeWkc0b6fV6h4zo6RpWVlRo/frzS0tL04osv/un2mUf+ER0drS5duvicI8wPa82fP1/vvvuuPvnkE68jEHxJTU2V1LKnlSLI/3r27KnBgwdr165duvzyy1VfX68jR4547Q1iTv2OIugcERMTo5iYmDOyLbfbreXLl+vgwYOeK/Lk5eUpIiJC5513nqfPxo0bvV6Xl5cnt9t9RjLYQUfHzBijnJwcz5X6/kxJSYni4+NPJ6Ltnc68KikpkcPh8Mwht9utpUuXqqGhwTN+eXl5SklJ4VC409CRMTpw4IDGjx+vUaNGKScnRw7Hn58WyzzyD6fTqVGjRik/P19Tp06V1HIIVn5+vubPn29tOJsyxuiOO+7QO++8o4KCglaH8/pSUlIiScwZi/z000/avXu3pk+frlGjRik4OFj5+fm6+uqrJUllZWWqqKjgs9oJVl+ZAf63d+9eU1xcbB588EHTvXt3U1xcbIqLi83Ro0eNMcY0Njaa4cOHm4kTJ5qSkhLz/vvvm5iYGLNkyRLPNr7//nsTHh5uFi5caEpLS80zzzxjunTpYt5//32rfqxz3qZNm4wkU1pa2mpdbm6uefXVV01paakpLS01y5cvNw6Hw7z88ssWJLWfLVu2mMcff9yUlJSY3bt3m1deecXExMSYGTNmePocOXLExMbGmunTp5sdO3aY1157zYSHh5sXXnjBwuT2sX//fjNo0CAzYcIEs3//flNVVeV5nMA8stZrr71mQkJCTG5urvn222/NnDlzTM+ePb2uVAr/ue2224zL5TIFBQVe8+XYsWPGGGN27dplsrOzzZdffmnKy8vN+vXrTXJysklPT7c4uX1kZWWZgoICU15ebjZv3mwyMjJMdHS0OXjwoDHGmLlz55qkpCTz0UcfmS+//NK43W7jdrstTh04KIJs6MYbbzSSWj0+/vhjT589e/aYSZMmmbCwMBMdHW2ysrJMQ0OD13Y+/vhjc8EFFxin02mSk5NNTk6Of38Qm7nuuutMWlqaz3W5ublm6NChJjw83ERERJgxY8Z4XRYTnWvbtm0mNTXVuFwuExoaaoYOHWoeeugh8+uvv3r1++qrr8yll15qQkJCTJ8+fczKlSstSmw/OTk5Pv/u/fF/gcwj6z311FMmKSnJOJ1OM2bMGLN161arI9nWyebLiff6iooKk56ebnr16mVCQkLMoEGDzMKFC01tba21wW1k2rRpJj4+3jidTtOnTx8zbdo0s2vXLs/6X375xdx+++0mMjLShIeHmyuvvNLrHz92F2SMMf7e+wQAAAAAVuE+QQAAAABshSIIAAAAgK1QBAEAAACwFYogAAAAALZCEQQAAADAViiCAAAAANgKRRAAAAAAW6EIAgAAAGArFEEAAAAAbIUiCAAAAICtUAQBAAAAsJX/B/xtZy0NanRtAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示聚类的结果\n",
    "plt.figure(figsize=(10, 8))\n",
    "# 建立四个颜色的列表\n",
    "colored = ['orange', 'green', 'blue', 'purple']\n",
    "colr = [colored[i] for i in predict]\n",
    "#去选择任意两个特征来看聚类的图，可以自行调整,第2个，第20个特征\n",
    "plt.scatter(x[:, 3], x[:, 21], color=colr)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 评判聚类效果，轮廓系数"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:35:16.690553900Z",
     "start_time": "2024-05-13T10:35:16.626589700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.6223046503285691"
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评判聚类效果，轮廓系数，聚类效果很难超过0.7，可以通过这个得分去调整上面KMeans的n_clusters\n",
    "silhouette_score(x, predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 实际上要分成几类，还得看需求"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-13T10:36:37.022128800Z",
     "start_time": "2024-05-13T10:36:36.980242600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6779999767609063\n",
      "--------------------------------------------------\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0\n",
      " 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0\n",
      " 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0\n",
      " 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0\n",
      " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0\n",
      " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1\n",
      " 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1\n",
      " 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\3.8\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n",
      "  super()._check_params_vs_input(X, default_n_init=10)\n"
     ]
    }
   ],
   "source": [
    "# 改为2时的结果\n",
    "km = KMeans(n_clusters=2)\n",
    "km.fit(x)  #开始训练\n",
    "predict = km.predict(x)\n",
    "print(silhouette_score(x, predict))\n",
    "print(\"-\"*50)\n",
    "print(predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "outputs": [
    {
     "data": {
      "text/plain": "aisle\nair fresheners candles           0\nasian foods                      0\nbaby accessories                 0\nbaby bath body care              0\nbaby food formula                0\n                                ..\ntrash bags liners                0\nvitamins supplements             0\nwater seltzer sparkling water    0\nwhite wines                      0\nyogurt                           1\nName: 1, Length: 134, dtype: int64"
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过分类后数据，去看原始样本的特点\n",
    "cross.iloc[0]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T10:37:48.924153100Z",
     "start_time": "2024-05-13T10:37:48.884615Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n"
     ]
    },
    {
     "data": {
      "text/plain": "aisle\nair fresheners candles             0\nasian foods                        4\nbaby accessories                   0\nbaby bath body care                0\nbaby food formula                  0\n                                ... \ntrash bags liners                  0\nvitamins supplements               0\nwater seltzer sparkling water     92\nwhite wines                        0\nyogurt                           150\nName: 27, Length: 134, dtype: int64"
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(predict[26])\n",
    "cross.iloc[26]  # 26号用户是第二类用户，看一下他去过哪些过道"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-05-13T10:38:17.685246200Z",
     "start_time": "2024-05-13T10:38:17.633537400Z"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
